package com.longlonggo.dao.base;

import com.longlonggo.entity.BaseEntity;
import com.longlonggo.util.PageUtil;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 持久化层父类，需要被其他持久化接口继承
 *
 * @author me@longlonggo.com
 * @version 100-000-000<br/>
 * 创建日期：2017年8月6日 <br/>
 * 历史修订：<br/>
 */
@Mapper
public interface IBaseDao {
    /**
     * 保存实体(可以保存非空对象，不做非空判断)
     *
     * @param entity 实体
     * @return 返回保存后的id
     */
    public int insert(BaseEntity entity);

    /**
     * 保存实体(保存时做非空判断，为空值不保存)
     *
     * @param entity 实体
     * @return 返回保存后的id
     */
    public int insertSelective(BaseEntity entity);

    /**
     * 根据ID查询实体信息
     *
     * @param id 实体ID
     * @return 返回base实体
     */
    public BaseEntity selectByPrimaryKey(int id);

    /**
     * 根据id删除实体
     *
     * @param id 要删除的主键id
     */
    public void deleteByPrimaryKey(int id);

    /**
     * 更新实体(做非空判断，为空值不做更新)
     *
     * @param entity 实体
     */
    public void updateByPrimaryKeySelective(BaseEntity entity);

    /**
     * 更新实体(不做非空判断，空值也会执行更新)
     *
     * @param entity 实体
     */
    public void updateByPrimaryKey(BaseEntity entity);

    /**
     * 更新实体(更新包含更新大字段)
     *
     * @param entity 实体
     */
    public void updateByPrimaryKeyWithBLOBs(BaseEntity entity);


    /**
     * 查询所有
     *
     * @return 返回list数组
     */
    public List<?> queryAll();

    /**
     * 分页查询
     *
     * @param page  分页实体
     * @param order 排序字段
     * @param order order 排序方式,true:asc;fales:desc
     * @return 返回list数组
     */
    public List<?> queryAllByPage(@Param("page") PageUtil page, @Param("orderBy") String orderBy,
                                  @Param("order") boolean order);

    /**
     * 查询数据表中记录集合总数
     *
     * @return 返回查询总条数
     */
    public int count();

    /**
     * 批量新增
     *
     * @param list 新增数据
     */
    public void saveBatch(@Param("list") List<?> list);

    /**
     * 根据id集合实现批量的删除
     *
     * @param ids id集合
     */
    public void deleteBatch(@Param("ids") String[] ids);

    /**
     * 根据map条件条件查询列表
     *
     * @param map 查询条件集合 key:条件名 value:值
     * @return 列表
     */
    public List<?> queryListByMap(@Param("map") Map<String, Object> map);

    /**
     * 分页查询<br/>
     * 根据map条件查询列表
     *
     * @param map     查询条件集合 key:条件名 value：值
     * @param page    分页条件
     * @param orderBy 排序字段
     * @param order   排序方式;true:asc[降序];false:desc[升序]
     * @return 列表集合
     */
    public List<?> queryListByMapPage(@Param("map") Map<String, Object> map, @Param("page") PageUtil page,
                                      @Param("orderBy") String orderBy, @Param("order") Boolean order);

    /**
     * 根据map条件查询记录总数
     *
     * @param map 查询条件集合 key:条件名 value:值
     * @return
     */
    public int countByMap(@Param("map") Map<String, Object> map);

    /**
     * 根据map条件以及组织好的where条件语句查询列表
     *
     * @param map     查询条件集合 key:条件名 value:值
     * @param where   条件语句
     * @param page    分页对象
     * @param orderBy 依据排序字段
     * @param order   排序方式
     * @return 列表数据
     */
    public List<?> queryBySearch(@Param("map") Map<String, Object> map, @Param("where") String where,
                                 @Param("page") PageUtil page, @Param("orderBy") String orderBy, @Param("order") Boolean order);

    /**
     * 根据map条件以及组织好的where条件语句查询总数
     *
     * @param map   查询条件集合 key:条件名 value:值
     * @param where 条件语句
     * @return 总数
     */
    public int countBySearch(@Param("map") Map<String, Object> map, @Param("where") String where);

    /**
     * 批量更新
     *
     * @param list 需要更新的对象集合
     */
    public void updateBatchById(@Param("id") int id, @Param("list") List<?> list);

    /**
     * 批量更新
     *
     * @param list 需要更新的对象集合
     */
    public void saveBatchById(@Param("id") int id, @Param("list") List<?> list);

    /**
     * 批量更新实体
     *
     * @param list 实体集合
     */
    public void updatesBatch(@Param("list") List<?> list);

    /**
     * 通过订单编号获取订单实体<br/>
     * 使用本函数必须保证订单编号在查询的表中是唯一的
     *
     * @param no 订单编号
     * @return 订单实体
     */
    public BaseEntity getEntityByNo(@Param("no") String no);

    /**
     * 根据编号获取数据集合
     *
     * @param code 组编号
     * @return 组数据集
     */
    List<?> queryListByCode(@Param("code") String code);
}
